这些问题都是工作中遇到的一些问题,现在来总结一下。工作中用到的是UGUI
(随机数的不重复)
- Text 首行缩进,使用全角空格(/U3000),还算是一种解决方法。
- 在写单例时,注意不要继承Monobehavior,容易出现问题。
Text 在文字赋值后,立刻获取preferredWidth属性,获取的值并不是总是正确的,但在协程中等待当前帧结束获取的值,会比较接近。
IEnumerator SetTextHeight()
{
yieldreturnnew WaitForEndOfFrame();
var width = ContentText.preferredWidth;
}在ScrollRect拖拽时,怎样判断向上还是向下拖拽?
OnEndDrag时,得到Content,根据content的LocalPosition的y值判定,>0 是向上拖拽,<0 是向下拖拽。ScrollView的深入了解
使用scrollview自动添加垂直项时,使用Vertical Layout Group和content size fitter 两个控件,其中content size fitter 的vertical fit 使用min size
Vertical Layout Group的child alignment 可以设置排列的对齐。UGUI 自适应
Rect Transform 的stretch 可以设置自适应,感觉很好玩。

同时点击shift和alt 又是另一种效果。这里没有截到图,哇,一开始都没注意呢。
- 背包的拖拽放置
背包的拖拽是在网上找到一种方法。
首先先摆好格子和拖拽项(当然拖拽项也可以动态生成),格子和拖拽项的tag分别设置为Grid 和 Item。
然后写一个DragAndDrop的代码(名称随意)给拖拽项,其中代码的内容如下:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556private static Transform canvasTra;private Transform nowParent;//一般来说,物品是格子的子物体,nowParent记录的是当前物品属于哪个格子private bool isRaycastLocationValid = true;//默认射线不能穿透物品public void OnBeginDrag(PointerEventData eventData){if (canvasTra == null) canvasTra = GameObject.Find("Canvas").transform;nowParent = transform.parent;transform.SetParent(canvasTra);//将当前拖拽的物品置前isRaycastLocationValid = false;}public void OnDrag(PointerEventData eventData){transform.position = Input.mousePosition;}public void OnEndDrag(PointerEventData eventData){GameObject go = eventData.pointerCurrentRaycast.gameObject;if (go != null){//Debug.Log(go.name);if (go.tag.Equals("Grid"))//放置到空格子{SetParentAndPosition(transform, go.transform);}else if (go.tag.Equals("Item"))//交换位置,注意可能需要把物品下的子物体的Raycast Target关掉{SetParentAndPosition(transform, go.transform.parent.parent);SetParentAndPosition(go.transform.parent, nowParent);}else{SetParentAndPosition(transform, nowParent);}}else{SetParentAndPosition(transform, nowParent);}isRaycastLocationValid = true;}private void SetParentAndPosition(Transform child, Transform parent){child.SetParent(parent);child.position = parent.position;}public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera){return isRaycastLocationValid;}
原理是当拖拽结束时,用射线判断是当前位置的物体的tag是拖拽项(Item)还是格子(Grid),如果是格子直接成为格子的子物体,如果是拖拽项,交换他们的父物体。